iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 18
1
AI & Data

30天 python 學習心得分享系列 第 18

Day18-爬蟲實戰1

  • 分享至 

  • xImage
  •  

學了前面兩個模組的使用方式,今天就來實戰看看吧!
先來設定目標,選取一個網站後慢慢的加篩選條件,以符合我們的期望.

爬取PTT的soft_job 版第一頁的標題與連結

要取得紅色區塊內未被刪除的文章
https://ithelp.ithome.com.tw/upload/images/20181101/2011050301jRqTpDx4.jpg

透過瀏覽器開發者工具可以找出要撈取的物件屬性.從下圖中我們可以看到要撈取的的是div的class為title是我們要取的目標
https://ithelp.ithome.com.tw/upload/images/20181101/201105036lRfAmdHIk.png

from bs4 import BeautifulSoup
import requests

uri = 'https://www.ptt.cc/bbs/Soft_Job/index.html'
html = requests.get(uri)
soup = BeautifulSoup(html.content, 'html.parser')


titles = soup.find_all('div', class_ = 'title', limit = 20) #找出指定的 class class面前20筆為我們要撈取資料

for i, item in enumerate(titles):
    if item.find('a'): #過濾掉被刪除的文章
        s = item.find('a')
        print('#{}標題: {} \n 連結:https://www.ptt.cc{}'.format(i+1, s.string, s.get('href')))
        
#輸出:
#1標題: [徵才] 徵Senior DevOps Engineer(90K~120K/mont 
 #連結:https://www.ptt.cc/bbs/Soft_Job/M.1540891740.A.FCB.html
#3標題: [請益] offer選擇 
 #連結:https://www.ptt.cc/bbs/Soft_Job/M.1540912049.A.5BB.html
#4標題: Re: [請益] [請益]想問職場經歷和碩士學位的取捨 
 #連結:https://www.ptt.cc/bbs/Soft_Job/M.1540917272.A.3E9.html
#5標題: [徵才] COBINHOOD 徵求前端工程師(72K~120K/mon) 
 #連結:https://www.ptt.cc/bbs/Soft_Job/M.1540950761.A.B25.html
#7標題: [請益] 關於#1Rr7HjGy及#1RrPozuS兩篇徵才文 
 #連結:https://www.ptt.cc/bbs/Soft_Job/M.1540975462.A.AA9.html
#8標題: [請益] 沒簽約案子怕拿不到錢 
 #連結:https://www.ptt.cc/bbs/Soft_Job/M.1540983640.A.894.html
#10標題: Re: [請益] [請益]想問職場經歷和碩士學位的取捨 
 #連結:https://www.ptt.cc/bbs/Soft_Job/M.1540987810.A.37D.html
#11標題: Re: [請益] [請益]想問職場經歷和碩士學位的取 
 #連結:https://www.ptt.cc/bbs/Soft_Job/M.1540988400.A.A7F.html
#12標題: [徵才] OneDegree 徵資安主管 (60~100K up/5Y) 
 #連結:https://www.ptt.cc/bbs/Soft_Job/M.1541001848.A.6A2.html
#13標題: [請益] 前端工程師需要會ps嗎? 
 #連結:https://www.ptt.cc/bbs/Soft_Job/M.1541039554.A.B34.html
#14標題: [請益] 轉職請益 
 #連結:https://www.ptt.cc/bbs/Soft_Job/M.1541044575.A.E80.html
#15標題: [請益] 新創公司門檻 
 #連結:https://www.ptt.cc/bbs/Soft_Job/M.1541048044.A.A99.html
#16標題: [徵才] 百睿達有限公司  誠徵後端工程師 
 #連結:https://www.ptt.cc/bbs/Soft_Job/M.1541049353.A.4C1.html
#17標題: [徵才] 留學顧問公司徵前端工程師(台北) 
 #連結:https://www.ptt.cc/bbs/Soft_Job/M.1541051202.A.EA2.html
#18標題: [徵才] H&L 代徵 Software Engineer (70K~120K+) 
 #連結:https://www.ptt.cc/bbs/Soft_Job/M.1541063366.A.BDC.html
#19標題: [徵才] H&L 代徵 DevOps Engineer (80K~120K+) 
 #連結:https://www.ptt.cc/bbs/Soft_Job/M.1541063561.A.E88.html
#20標題: Fw: [徵才] 思華科技-DBA資料庫技術工程師 
 #連結:https://www.ptt.cc/bbs/Soft_Job/M.1541067017.A.5FD.html

以上就可以撈出第一頁的資料,但我們可能需要按照類別進行分類所以可以將程式修改為:

titles = soup.find_all('div', class_ = 'title', limit = 20) #找出指定的 class class面前20筆為我們要撈取資料
category = '[' + input('請輸入要搜尋的類別:') + ']'
i = 0
for item in titles:
    if item.find('a'): #過濾掉被刪除的文章
        s = item.find('a')
        title_text = s.string
        if title_text.startswith(category) :
            i = i+1
            print('#{}標題: {} \n #連結:https://www.ptt.cc{}'.format(i, title_text, s.get('href')))
            
#輸入:徵才
#輸出:
#1標題: [徵才] 徵Senior DevOps Engineer(90K~120K/mont 
 #連結:https://www.ptt.cc/bbs/Soft_Job/M.1540891740.A.FCB.html
#2標題: [徵才] COBINHOOD 徵求前端工程師(72K~120K/mon) 
 #連結:https://www.ptt.cc/bbs/Soft_Job/M.1540950761.A.B25.html
#3標題: [徵才] OneDegree 徵資安主管 (60~100K up/5Y) 
 #連結:https://www.ptt.cc/bbs/Soft_Job/M.1541001848.A.6A2.html
#4標題: [徵才] 百睿達有限公司  誠徵後端工程師 
 #連結:https://www.ptt.cc/bbs/Soft_Job/M.1541049353.A.4C1.html
#5標題: [徵才] 留學顧問公司徵前端工程師(台北) 
 #連結:https://www.ptt.cc/bbs/Soft_Job/M.1541051202.A.EA2.html
#6標題: [徵才] H&L 代徵 Software Engineer (70K~120K+) 
 #連結:https://www.ptt.cc/bbs/Soft_Job/M.1541063366.A.BDC.html
#7標題: [徵才] H&L 代徵 DevOps Engineer (80K~120K+) 
 #連結:https://www.ptt.cc/bbs/Soft_Job/M.1541063561.A.E88.html

若想包含更多資料可以再去觀察其他資訊的tag以便爬取, 舉例來說我們可以再增加發文日期,程式如下:

r_ent_div = soup.find_all('div', class_ = 'r-ent', limit = 20) #找出指定的 class class面前20筆為我們要撈取資料
category = '[' + input('請輸入要搜尋的類別:') + ']'
i = 0

for item in r_ent_div:
    title = item.find( class_ = 'title')
    if title.find('a'): #過濾掉被刪除的文章
        s = title.find('a')
        title_text = s.string
        date = item.find('div', class_ = 'date')
        if title_text.startswith(category) :
            i = i+1
            print('#{}標題: {} 發文日期: {} \n #連結:https://www.ptt.cc{}'.format(i, title_text, date.string, s.get('href')))
            
#輸入:徵才
#輸出:
#1標題: [徵才] 徵Senior DevOps Engineer(90K~120K/mont 發文日期: 10/30 
 #連結:https://www.ptt.cc/bbs/Soft_Job/M.1540891740.A.FCB.html
#2標題: [徵才] COBINHOOD 徵求前端工程師(72K~120K/mon) 發文日期: 10/31 
 #連結:https://www.ptt.cc/bbs/Soft_Job/M.1540950761.A.B25.html
#3標題: [徵才] OneDegree 徵資安主管 (60~100K up/5Y) 發文日期: 11/01 
 #連結:https://www.ptt.cc/bbs/Soft_Job/M.1541001848.A.6A2.html
#4標題: [徵才] 百睿達有限公司  誠徵後端工程師 發文日期: 11/01 
 #連結:https://www.ptt.cc/bbs/Soft_Job/M.1541049353.A.4C1.html
#5標題: [徵才] 留學顧問公司徵前端工程師(台北) 發文日期: 11/01 
 #連結:https://www.ptt.cc/bbs/Soft_Job/M.1541051202.A.EA2.html
#6標題: [徵才] H&L 代徵 Software Engineer (70K~120K+) 發文日期: 11/01 
 #連結:https://www.ptt.cc/bbs/Soft_Job/M.1541063366.A.BDC.html
#7標題: [徵才] H&L 代徵 DevOps Engineer (80K~120K+) 發文日期: 11/01 
 #連結:https://www.ptt.cc/bbs/Soft_Job/M.1541063561.A.E88.html

下篇文章我們再來嘗試如何抓取多頁.
文章內容如果有錯誤歡迎留言告知,可以幫忙糾正錯誤的觀念,感謝!


上一篇
Day17-爬蟲使用模組介紹-Beautiful Soup 2
下一篇
Day19-爬蟲實戰2
系列文
30天 python 學習心得分享30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言